现象
STM32CubeMX提供了串口的HAL库,网上能找到很多例子,但是真正运行起来会时不时卡死。
原因
代码中使用了在
1
| void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
|
函数中调用
1
| HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
|
重新启动中断,并将数据送入队列的方法。
会造成两个问题:
HAL_UART_Receive_IT中检测__HAL_LOCK(huart),中断外调用HAL_UART_Transmit时也会锁定此huart,再进入接收中断时有几率造成死锁。
发生OverRun错误会停止中断。
解决方法
定期检测串口,防止死锁造成的无法恢复的失败。
写好HAL_UART_ErrorCallback函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| extern UART_HandleTypeDef huart3; volatile char data; extern osMessageQId rxQHandle;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART3){ BaseType_t xHigherPriorityTaskWoken; xHigherPriorityTaskWoken = pdTRUE; xQueueSendFromISR(rxQHandle, (void*)&data, &xHigherPriorityTaskWoken); if (HAL_UART_Receive_IT(huart, (uint8_t*)&data ,1) != HAL_OK){ } } }
void HAL_UART_ErrorCallback(UART_HandleTypeDef* huart){ uint32_t isrflags = READ_REG(huart->Instance->SR); if((__HAL_UART_GET_FLAG(huart, UART_FLAG_PE))!=RESET) { __HAL_UART_CLEAR_PEFLAG(huart); } if((__HAL_UART_GET_FLAG(huart, UART_FLAG_FE))!=RESET) { __HAL_UART_CLEAR_FEFLAG(huart); } if((__HAL_UART_GET_FLAG(huart, UART_FLAG_NE))!=RESET) { __HAL_UART_CLEAR_NEFLAG(huart); } if((__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE))!=RESET) { __HAL_UART_CLEAR_OREFLAG(huart); } huart->RxState = HAL_UART_STATE_READY; huart->ErrorCode = HAL_UART_ERROR_NONE;
__HAL_UART_DISABLE_IT(huart, UART_IT_RXNE); __HAL_UART_DISABLE_IT(huart, UART_IT_PE); __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);
if (huart->Instance == USART3){ if (HAL_UART_Receive_IT(huart, (uint8_t*)&data ,1) != HAL_OK){ } } }
void call_this_function_periodically(ali_cloud* app){ if ((__HAL_UART_GET_FLAG(&huart3, UART_FLAG_ORE) != RESET) || (huart3.Instance->CR1 & USART_CR1_RXNEIE == RESET)) { __disable_irq(); HAL_UART_ErrorCallback(&huart3); __enable_irq(); } }
|
总结
STM32的用户较少,网上资料不可轻信,使用任何外设都要详细查找坑的所在。
STM32的官方资料不全。
简单的东西出现小问题也很耗时间,还是需要熟悉各种细节的人相互配合。